import sys
from PIL import Image

def read_bin_file(file_path, width=29, height=29):
    """读取bin文件，返回01矩阵（height行 × width列）"""
    try:
        with open(file_path, 'rb') as f:
            # 读取所有字节（每个字节是0或1）
            data = f.read()
            # 验证数据长度是否符合 宽×高
            expected_length = width * height
            if len(data) != expected_length:
                raise ValueError(f"文件尺寸错误！预期 {expected_length} 字节（{width}×{height}），实际 {len(data)} 字节")
            # 转换为01矩阵（每行width个元素）
            matrix = []
            for i in range(height):
                start = i * width
                end = start + width
                row = [int(byte) for byte in data[start:end]]
                matrix.append(row)
            return matrix
    except FileNotFoundError:
        raise FileNotFoundError(f"未找到文件：{file_path}")
    except Exception as e:
        raise Exception(f"读取文件失败：{str(e)}")

def print_matrix(matrix):
    """以文本形式打印01矩阵（0用空格，1用#）"""
    print("文本可视化（0=空格，1=#）：")
    for row in matrix:
        line = ''.join(['#' if x == 1 else ' ' for x in row])
        print(line)

def save_as_image(matrix, output_path="output.png"):
    """将01矩阵保存为图像（0=白色，1=黑色）"""
    height = len(matrix)
    width = len(matrix[0]) if height > 0 else 0
    
    # 创建图像（放大10倍以便查看，否则太小）
    scale = 10
    img = Image.new('1', (width * scale, height * scale), color=1)  # 1=白色背景
    pixels = img.load()
    
    # 绘制像素（1=黑色）
    for y in range(height):
        for x in range(width):
            if matrix[y][x] == 1:
                # 放大每个像素为scale×scale的方块
                for dy in range(scale):
                    for dx in range(scale):
                        pixels[x * scale + dx, y * scale + dy] = 0  # 0=黑色
    img.save(output_path)
    print(f"\n图像已保存至：{output_path}（放大了{scale}倍）")

if __name__ == "__main__":
    # 从命令行获取bin文件路径（默认读pixel_binary.bin）
    if len(sys.argv) < 2:
        bin_file = "PixelBinary.bin"  # 默认文件名
        print(f"未指定文件，将读取默认文件：{bin_file}")
    else:
        bin_file = sys.argv[1]
    
    try:
        # 读取29×28的01矩阵
        matrix = read_bin_file(bin_file, width=29, height=29)
        # 文本打印
        print_matrix(matrix)
        # 保存为图像
        save_as_image(matrix)
    except Exception as e:
        print(f"错误：{str(e)}")